package cn.suxiaoxiang.suwebverify.events;

import cn.suxiaoxiang.suwebverify.SuWebVerify;
import cn.suxiaoxiang.suwebverify.config.MessageConfig;
import cn.suxiaoxiang.suwebverify.util.AutoLoginCache;
import cn.suxiaoxiang.suwebverify.util.IpUtil;
import cn.suxiaoxiang.suwebverify.util.SQLiteManager;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import static cn.suxiaoxiang.suwebverify.SuWebVerify.main;
import static org.bukkit.Bukkit.getLogger;

/**
 * PlayerJoin - 玩家加入事件
 *
 * @author 程序员-Su_xiaoxiang
 * @date 2025/4/7 12:02
 */
public class PlayerJoin implements Listener {

    private MessageConfig messageConfig;

    // 在构造器中注入 messageConfig
    public PlayerJoin(SuWebVerify plugin) {
        this.messageConfig = new MessageConfig(plugin);
        this.messageConfig.loadPlayerCommandConfig();  // 加载配置文件
    }

    // 假设这是一个存储玩家登录状态的会话
    public static final Map<String, Boolean> PLAYER_SESSIONS = new HashMap<>();
    //获取插件前缀
    String prefix = main.getConfig().getString("prefix");
    /**
     * 玩家加入事件
     *
     * @param event 事件
     */
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        String playerName = player.getName();
        String ip = IpUtil.normalizeIp(player.getAddress().getAddress().getHostAddress());
        // 读取自动登录配置
        boolean enable = main.getConfig().getBoolean("autoLogin.enable", false);
        long duration = main.getConfig().getLong("autoLogin.duration", 600) * 1000L;
        // 自动登录判断
        if (enable && AutoLoginCache.canAutoLogin(ip, playerName, duration)) {
            //System.out.println("[SuWebVerify][AutoLogin] 玩家 " + playerName + " 从IP " + ip + " 自动登录成功");
            PLAYER_SESSIONS.put(playerName, true);
            //player.removePotionEffect(PotionEffectType.BLINDNESS);
            player.sendMessage(prefix+messageConfig.getPlayerCommandConfig().getString("autoLogin"));
            return;
        } else {
            //System.out.println("[SuWebVerify][AutoLogin] 玩家 " + playerName + " 从IP " + ip + " 不能自动登录，进入正常流程");
        }
        // 判断玩家是否已经注册
        if (!isPlayerRegistered(player)) {
            // 获取 message.yml 中的注册消息
            String registrationMessage = messageConfig.getPlayerCommandConfig().getString("registerMessage");
            //获取注册定时发送时间
            int registerTime = main.getConfig().getInt("registerTime");
            //获取插件前缀
            String prefix = main.getConfig().getString("prefix");
            // 每隔 5 秒发送一次消息
            new BukkitRunnable() {
                @Override
                public void run() {
                    // 判断玩家是否仍然未登录，防止在玩家登录后继续发送消息
                    if (!isPlayerLoggedIn(player)) {
                        // 给玩家发送注册链接（例如网站链接），并禁用玩家的行动
                        player.sendMessage(prefix+registrationMessage);
                    } else {
                        // 如果玩家已经登录，取消定时任务
                        cancel();
                    }
                }
            }.runTaskTimer(SuWebVerify.getInstance(), 0, registerTime);
        } else {
            // 玩家已注册，检查玩家是否已登录
            if (!isPlayerLoggedIn(player)) {
                // 如果玩家没有登录，继续保持失明效果和禁用行动状态
                player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 1));
                // 获取 message.yml 中的注册消息
                String notLogged = messageConfig.getPlayerCommandConfig().getString("NotLogged");
                //获取登录定时发送时间
                int loginTime = main.getConfig().getInt("loginTime");
                //获取插件前缀
                String prefix = main.getConfig().getString("prefix");
                // 每隔 5 秒发送一次消息
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        // 判断玩家是否仍然未登录，防止在玩家登录后继续发送消息
                        if (!isPlayerLoggedIn(player)) {
                            player.sendMessage(prefix+notLogged);
                        } else {
                            // 如果玩家已经登录，取消定时任务
                            cancel();
                        }
                    }
                }.runTaskTimer(SuWebVerify.getInstance(), 0, loginTime);
            }
        }
    }


    /**
     * 判断玩家是否注册
     *
     * @param player 玩家
     * @return boolean
     */
    public boolean isPlayerRegistered(Player player) {
        // 获取玩家的用户名
        String username = player.getName();
        // 定义 SQL 查询语句
        String sql = "SELECT * FROM player WHERE username = ?";

        // 创建数据库连接
        try (PreparedStatement pstmt = SQLiteManager.getConnection().prepareStatement(sql)) {
            // 设置 SQL 语句中的参数
            pstmt.setString(1, username);
            // 执行查询，获取结果集
            try (ResultSet rs = pstmt.executeQuery()) {
                // 如果结果集中有数据，说明玩家已注册
                return rs.next();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            // 查询失败时返回 false
            return false;
        }
    }

    /**
     * 判断玩家是否登录
     */
    public boolean isPlayerLoggedIn(Player player) {
        // 使用会话记录来判断
        return PLAYER_SESSIONS.getOrDefault(player.getName(), false);
    }
}
